package com.enjoyor.soa.traffic.frame.support.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 
 * @ClassName: SpringContextUtil 
 * @Description: spring注册的bean管理 
 * @author wuhao
 * @email 
 * @date 2016年3月14日 上午9:48:12
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
	
  private static ApplicationContext context;     //Spring应用上下文环境
 
  /**
  * 实现ApplicationContextAware接口的回调方法，设置上下文环境   
  * @param applicationContext
  * @throws BeansException
  */
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	  if(SpringContextUtil.context == null) {
		  SpringContextUtil.context = applicationContext;
      }
      System.out.println("---------------------------------------------------------------------");

      System.out.println("---------------------------------------------------------------------");

      System.out.println("---------------me.shijunjie.util.SpringUtil------------------------------------------------------");

      System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringContextUtil.context+"========");

      System.out.println("---------------------------------------------------------------------");

  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return context;
  }
 
  /**
  * 获取对象   
  * @param name
  * @return Object 一个以所给名字注册的bean的实例
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return context.getBean(name);
  }
 

  /**
  * 获取类型为requiredType的对象
  * @param requiredType 返回对象类型
  * @return Object 一个类型为requiredType的bean的实例
  * @throws BeansException
  */
  public static Object getBean(Class<?> requiredType) throws BeansException {
    return context.getBean(requiredType);
  }
  
  /**
  * 获取类型为requiredType的对象
  * 如果bean不能被类型转换，相应的异常将会被抛出（BeanNotOfRequiredTypeException）
  * @param name       bean注册名
  * @param requiredType 返回对象类型
  * @return Object 返回requiredType类型对象
  * @throws BeansException
  */
  public static Object getBean(String name, Class<?> requiredType) throws BeansException {
    return context.getBean(name, requiredType);
  }
 
  /**
  * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true 
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return context.containsBean(name);
  }
 
  /**
  * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
  * 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）   
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return context.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 注册对象的类型
  * @throws NoSuchBeanDefinitionException
  */
  @SuppressWarnings("rawtypes")
  public static Class getType(String name) throws NoSuchBeanDefinitionException {
    return context.getType(name);
  }
 
  /**
  * 如果给定的bean名字在bean定义中有别名，则返回这些别名   
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return context.getAliases(name);
  }
  
  
  /**
   * 判断是否已经获取当前上下文路径
   * @return
   * @throws NoSuchBeanDefinitionException
   */
   public static boolean isHasApplication(){
     if(context == null){
    	 return false;
     }
     else{
    	 return true;
     }
   }
}